<?php
/**
 *
 * Класс Service_WikiParse
 * 
 */
class Service_WikiParse {
	public $currentCities = array();		// Массив городов в БД на момент запуска скрипта
	public $gettedRoutes = 0;				// Счётчик от парсенный маршрутов
	public $routeParcingLimit = 999999;		// Лимит обращений к avtodispetcher.ru за время работу скрипта
	public $sleeptime = 11;					// Среднее время задержки между обращениеями к avtodispetcher.ru
	
	public function regionParse() {
		Service_Debug::setDebug();
		$objCurl = new Service_Curl();
		$objCity = new City();
		
		// Массив всех городов из БД
		$this->currentCities = $objCity->find('all', array('select' => '`city`.`ID_city`,`city`.`city_name`'));
		$citiesCount = count($this->currentCities);
		
		// Пишем в лог открытие нового сеанса
		if (false != ($fp = fopen('parse_log.txt', 'at'))) {
			$string =  "\n\n" . gmdate("Y-m-d H:i:s") . " ############# Новый сеанс #############\n\n";
			fwrite($fp,$string);
		}
		
		for($i = 0; $i < count($this->currentCities); $i++) {
			$objCity = new City($this->currentCities[$i]['ID_city']);
			$parseResult = $this->parseOneRegion($objCurl, $objCity);
		
			// Пишем в лог
			$logString = Pressure::calculateCurrentDuration() . ' -------' . $objCity->getField('city_name') . '------- ';
			if(!empty($parseResult)) {
				foreach($parseResult as $error) {
					fwrite($fp, $error . "\n");
				}
			}
			
		}
		
		if ($fp) fclose($fp);
	}
	
	public function parseOneRegion($objCurl, City $objCity) {	
		Service_Debug::setDebug();
		$error = array();
		$cityResultArray = array();
		$urlPattern = 'http://ru.wikipedia.org/wiki/';
		
		$cityName =  str_replace(' ', '_', $objCity->getField('city_name'));
			
		$result = $objCurl->httpRequest('GET', $urlPattern . $cityName, null, false);

		// Субъект Федерации
		$region = preg_match("#class=\"region\">(.*?)</span#si", $result, $arrMatches);
		if($region) {
			$objRegion = new Region();
			$regionId = $objRegion->getIdByName($arrMatches[1]);
			if($regionId) $cityResultArray['ID_region'] =  $regionId;
		}
		else $error [] = 'Не удалось получить субъект федерации';
		
		// Население
		$population = preg_match("#Население.*?\>([0-9\&\#\;\s]{2,})<sup\sid=\"cite_ref-n#si", $result, $arrMatches);
		if($population)  $cityResultArray['population'] =  str_replace (' ', '', $arrMatches[1]);
		else {
			// Население
			$population = preg_match("#Население.*?\>([0-9\sа-я,\&\#\;]{2,}).*?</span></div#siu", $result, $arrMatches);
			if($population)  {
				if(preg_match("#^[0-9\s]*$#siu", $arrMatches[1], $arr)) $cityResultArray['population'] =  str_replace (' ', '', $arrMatches[1]);
				else $cityResultArray['population_str'] =  str_replace (' ', '', $arrMatches[1]);
			}
			else $error [] = 'Не удалось получить население';
		}

		// Площадь
		$square = preg_match("#Площадь.*?<div>([0-9,\s]*)#si", $result, $arrMatches);
		if($square)  $cityResultArray['square'] =  str_replace (' ', '', $arrMatches[1]);
		else $error [] = 'Не удалось получить площадь';
		
		// Плотность населения
		$populationDensity = preg_match("#Плотность.*?<div>([0-9,\s]*)#si", $result, $arrMatches);
		if($populationDensity) $cityResultArray['population_density'] =  str_replace (' ', '', $arrMatches[1]);
		else $error [] = 'Не удалось получить плотность населения';
		
		// Агломерация
		$agglomeration = preg_match("#Агломерация.*?\>([0-9,\s]*)</#si", $result, $arrMatches);
		if($agglomeration) $cityResultArray['agglomeration'] =  str_replace (' ', '', $arrMatches[1]);
		else $error [] = 'Не удалось получить агломерацию';
		
		// Этнохороним
		$etnohoronim = preg_match("#Этнохороним.*?<div>(.*?)</div>.*?Часовой#si", $result, $arrMatches);
		if($etnohoronim) $cityResultArray['etnohoronim'] =  $arrMatches[1];
		else $error [] = 'Не удалось получить Этнохороним';
		
		// Часовой пояс
		$time = preg_match("#Часовой\sпояс</a></td>.*?<a.*?\>(.*?)</a>#si", $result, $arrMatches);
		if($time) $cityResultArray['time'] = str_replace (' ', '', $arrMatches[1]);
		else $error [] = 'Не удалось получить часовой пояс';
		
		
		// Автомобильный код
		$avtocode = preg_match("#Автомобильный\sкод</a></td>.*?\>(.*?)</div>#si", $result, $arrMatches);
		if($avtocode) $cityResultArray['auto_code'] = $arrMatches[1];
		else $error [] = 'Не удалось получить автомобильный код';
		
		
		// ОКАТО
		$okato = preg_match("#Код\sОКАТО</a></td>.*?<a.*?\>(.*?)</a></div>#si", $result, $arrMatches);
		if($okato) $cityResultArray['okato'] = $arrMatches[1];
		else $error [] = 'Не удалось получить автомобильный код';
		
		// Высота
		$height = preg_match("#Высота\sцентра.*?<div>([0-9\—-\s]*)<a#si", $result, $arrMatches);
		if($height) $cityResultArray['height'] = str_replace (' ', '', $arrMatches[1]);
		else $error [] = 'Не удалось получить высоту';
		
		// Первое упоминание
		$firstSay = preg_match("#Первое\sупоминание.*?\>([0-9]*)[год\s\.]*</#si", $result, $arrMatches);
		if($firstSay) $cityResultArray['first_say'] = $arrMatches[1];
		else $error [] = 'Не удалось получить первое упоминание';
		
		// Дата основания
		$founded = preg_match("#Основан.*?\>([0-9]*)</a#si", $result, $arrMatches);
		if($founded) $cityResultArray['founded'] = $arrMatches[1];
		else $error [] = 'Не удалось получить даты основания';
		
		// Сайт
		$site = preg_match("#Официальный\sсайт</td>.*?<a.*?href=\"(.*?)\"\>#si", $result, $arrMatches);
		if($site) $cityResultArray['site'] = $arrMatches[1];
		else $error [] = 'Не удалось получить официальный сайт';
		
		// Флаг
		$flag = preg_match("#alt=\"Флаг\".*?src=\"(.*?)\"#si", $result, $arrMatches);
		if($flag) $cityResultArray['flag_url'] = $arrMatches[1];
		else $error [] = 'Не удалось получить url флага';
		
		// Герб
		$arms = preg_match("#alt=\"Герб\".*?src=\"(.*?)\"#si", $result, $arrMatches);
		if($arms) $cityResultArray['arms_url'] = $arrMatches[1];
		else $error [] = 'Не удалось получить url герба';
		
		// Телефонный код
		$phoneCode = preg_match("#Телефонный\sкод</a></td>.*?<div>(.*?)</div>#si", $result, $arrMatches);
		if($phoneCode) $cityResultArray['phone_code'] = $arrMatches[1];
		else $error [] = 'Не удалось получить телефонный код';
		
		// Внутреннее деление
		$vnutrDel = preg_match("#Внутреннее\sделение</td>.*?<div>(.*?)</div>#si", $result, $arrMatches);
		if($vnutrDel) $cityResultArray['vnutr_delenie'] = $arrMatches[1];
		else $error [] = 'Не удалось получить внутреннее деление';

		if(!empty($cityResultArray)) {
			$cityResultArray['parse_url'] = $urlPattern . $cityName;
			$objCity->updateFields($cityResultArray);
		}
	
		return $error;
	}

}
?>